home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / outcode / xf4.c < prev   
Encoding:
C/C++ Source or Header  |  1995-02-06  |  1.6 KB  |  76 lines

  1. /* 2D transform and clip test a vertex list */
  2.  
  3. /* oflo and division traps should be disabled, by the way */
  4.  
  5. #define FI(x)    (*(int *)&x)
  6.  
  7. /********************************************************/
  8. xform_ctp(vc, vpi, vpo, visiz, vosiz, mtx, prj, pf, pa)
  9. int vc    ;    /* vertex count */
  10. int visiz;    /* input vertex array stride */
  11. int vosiz;    /* output vertex array stride */
  12. int *pf;    /* flag array */
  13. int *pa;    /* 2 element - global or_flag, and_flag */
  14. float *vpi, *vpo, *mtx, *prj;
  15. {
  16. register int flag, flag_or, flag_and;
  17. register int ti0, s, t, u;
  18. register int sign = 0x80000000;
  19.  
  20. /* flpt registers, total 32 */
  21. register float xx, xy, xt;    /* transformation matrix */
  22. register float yx, yy, yt;
  23. register float xo, yo;        /* output vertex */
  24. register float xi, yi;        /* temps */
  25.  
  26. /* load up local transform matrix */
  27. xx = *(mtx+0 ); xy = *(mtx+1 ); xt = *(mtx+2 );
  28. yx = *(mtx+4 ); yy = *(mtx+5 ); yt = *(mtx+6 );
  29.  
  30. /* initialize accumulated flags */
  31. flag_or = 0;
  32. flag_and = -1;
  33.  
  34. do {
  35.     xi = vpi[0];    /* xi */
  36.     yi = vpi[1];    /* yi */
  37.  
  38.     xo = xi * xx + yi * xy + xt;
  39.     yo = xi * yx + yi * yy + yt;
  40.  
  41.     /* let's try branches for comparison purposes */
  42.     flag = 0;
  43.  
  44. #define CXMIN    1
  45. #define CXMAX    2
  46. #define CYMIN    4
  47. #define CYMAX    8
  48.  
  49. #define XMIN    0
  50. #define XMAX    1279
  51. #define YMIN    0
  52. #define YMAX    1023
  53.  
  54.     if (xo < XMIN) flag |= CXMIN;
  55.     if (xo > XMAX) flag |= CXMAX;
  56.     if (yo < YMIN) flag |= CYMIN;
  57.     if (yo > YMAX) flag |= CYMAX;
  58.  
  59.     flag_or |= flag;
  60.     flag_and &= flag;
  61.  
  62.     *(vpo+0) = xo;
  63.     *(vpo+1) = yo;
  64.     *pf = flag;
  65.  
  66.     vpi += visiz;
  67.     vpo += vosiz;
  68.     pf++;
  69. } while (--vc > 0);
  70.  
  71. *(pa+0) = flag_or;
  72. *(pa+1) = flag_and;
  73.  
  74. return;
  75. }
  76.